comp.lang.c ++。moderatedでC ++ / STLの隠し機能とダークコーナーを読んだ後、次のスニペットがVisual Studio2008とG ++ 4.4の両方でコンパイルおよび動作することに完全に驚きました。 コードは次のとおりです。 #includeint main() {{ int x = 10; while(x-> 0)// xは0になります {{ printf( "%d"、x); } } 出力: 9 8 7 6 5 4 3 2 1 0 GCCでも機能するので、これはCだと思います。これは規格のどこで定義されており、どこから来たのですか?
2020-12-07 21:23:51
->は演算子ではありません。実際には、-と>の2つの別個の演算子です。 条件付きのコードはxをデクリメントし、xの元の(デクリメントされていない)値を返し、>演算子を使用して元の値を0と比較します。 理解を深めるために、ステートメントは次のように書くことができます。 while((x-)> 0) | または、まったく異なるものの場合... xは0にスライドします。 while(x- \ \ \ \ > 0) printf( "%d"、x); それほど数学的ではありませんが...すべての絵は千の言葉を描きます... | これは非常に複雑な演算子であるため、ISO / IEC JTC1(Joint Technical Committee 1)でさえ、その説明をC ++標準の2つの異なる部分に配置しました。 冗談はさておき、これらは2つの異なる演算子です。C++ 03標準の§5.2.6/ 2および§5.9でそれぞれ説明されている-および>。 | と同等です while(x-> 0) x-(デクリメント後)はx = x-1と同等であるため、コードは次のように変換されます。 while(x> 0){ x = x-1; //ロジック } バツ - ; // x <= 0の場合に行われるポストデクリメント | xは、反対方向にさらに速くゼロになる可能性があります。 int x = 10; while(0 <---- x) {{ printf( "%d"、x); } 8 6 4 2 矢印で速度をコントロールできます! int x = 100; while(0 <-------------------- x) {{ printf( "%d"、x); } 90 80 70 60 50 40 30 20 10 ;) | それは #includeint main(void){ int x = 10; while(x-> 0){// xは0になります printf( "%d"、x); } 0を返します。 } スペースだけで物事が面白く見えます-デクリメントして>比較します。 | ->の使用法には歴史的な関連性があります。デクリメントは、x86アーキテクチャでのインクリメントよりも高速でした(そして、場合によってはまだ高速です)。 ->を使用すると、xが0になることを示唆し、数学的な背景を持つ人々にアピールします。 | while(x-> 0) それがどのように解析されるかです。 | まったくオタクですが、私はこれを使用します: #define as; while int main(int argc、char * argv []) {{ int n = atoi(argv [1]); printf( "n is%d \ n"、n)as(n-> 0);を実行します。 0を返します。 } | 私が読んだある本(どの本を正しく覚えていないか)は次のように述べています。コンパイラは、左右のルールを使用して式を最大のトークンに解析しようとします。 この場合、式: x-> 0 最大のトークンへの解析: トークン1:x トークン2:- トークン3:> トークン4:0 結論:x-> 0 同じルールがこの式に適用されます。 a ----- b 解析後: トークン1:a トークン2:- トークン3:- トークン4:- トークン5:b 結論:(a-)--- b これが複雑な表現を理解するのに役立つことを願っています^^ | これはまったく同じです while(x--) {{ printf( "%d"、x); } 非負の数の場合 | とにかく、今は「goesto」演算子があります。 「->」は方向として覚えやすく、「xがゼロになる間」は意味-ストレートです。 さらに、一部のプラットフォームでは、「for(x = 10; x> 0; x-)」よりも少し効率的です。 | このコードは、最初にxと0を比較し、次にxをデクリメントします。 (最初の回答でも述べています。xをポストデクリメントしてから、xと0を>演算子で比較しています。)次のコードの出力を参照してください。 9 8 7 6 5 4 3 2 1 0 ここで、最初に比較してから、出力に0を表示してデクリメントします。 最初にデクリメントしてから比較する場合は、次のコードを使用します。 #include int main(void) {{ int x = 10; while(-x> 0)// xは0になります {{ printf( "%d"、x); } 0を返します。 } その出力は次のとおりです。 9 8 7 6 5 4 3 2 1 | このコードを実行すると、コンパイラは9876543210を出力します。 #include int main() {{ int x = 10; while(x-> 0)// xは0になります {{ std :: cout << x; } } 予想通り。 while(x-> 0)は、実際にはwhile(x> 0)を意味します。 x--ポストはxをデクリメントします。 while(x> 0) {{ バツ - ; std :: cout << x; } 同じことを書く別の方法です。 でも、オリジナルが「xが0になる間」のように見えるのはいいことです。 | -と>の間にスペースがありません。 xはポストデクリメントされます。つまり、条件x> 0?をチェックした後にデクリメントされます。 | -はデクリメント演算子で、>は大なり記号演算子です。 2つの演算子は、->のように1つの演算子として適用されます。 | これは、2つの演算子の組み合わせです。最初の-は値をデクリメントするためのものであり、>は値が右側のオペランドより大きいかどうかをチェックするためのものです。 #include int main() {{ int x = 10; while(x-> 0) printf( "%d"、x); 0を返します。 } 出力は次のようになります。 9 8 7 6 5 4 3 2 1 0 | 実際、xはポストデクリメントされており、その状態でチェックされています。 ->ではなく、(x-)> 0です 注:xの値は、ポストデクリメントされるため、条件がチェックされた後に変更されます。いくつかの同様のケースも発生する可能性があります。 -> x-> 0 ++> x ++> 0 -> = x-> = 0 ++> = x ++> = 0 | CおよびC ++は、「最大ムンク」ルールに従います。 a --- bが(a-)-bに変換されるのと同じ方法で、この場合、x-> 0は(x-)> 0に変換されます。 ルールが本質的に言っていることは、左から右に行くと、式は有効な式を形成する文字の最大数を取ることによって形成されるということです。 | なぜすべての合併症? 元の質問に対する簡単な答えは次のとおりです。 #include int main() {{ int x = 10; while(x>0) {{ printf( "%d"、x); x = x-1; } } それは同じことをします。私はあなたがこのようにすべきだと言っているのではありませんが、それは同じことをし、1つの投稿で質問に答えたでしょう。 x--は上記の省略形であり、>は通常の大なり記号演算子です。大きな謎はありません! 最近は単純なことを複雑にする人が多すぎます;) | 従来の方法では、whileループの括弧()で条件を定義し、中括弧{}で終了条件を定義しますが、->は両方を同時に定義します。 例えば: int abc(void) {{ int a = 5 while((a-)> 0)//デクリメントと比較の両方を同時に {{ //コード } } これにより、aがデクリメントされ、aが0より大きいときにループが実行されます。 従来は、次のようになります。 int abc(void) {{ int a = 5; while(a> 0) {{ a--; //コード } a--; } どちらの方法でも、私たちは同じことを行い、同じ目標を達成します。 | (x-> 0)は(x-> 0)を意味します。 (x->)出力を使用できます:9 8 7 6 5 4 3 2 1 0 使用できます(-x> 0)それは平均です(--x> 0)出力:9 8 7 6 5 4 3 2 1 使用できます (-\ \ x> 0) 出力:9 8 7 6 5 4 3 2 1 使用できます (\ \ x-> 0) 出力:9 8 7 6 5 4 3 2 1 0 使用できます (\ \ x-> 0 \ \ ) 出力:9 8 7 6 5 4 3 2 1 0 あなたも使うことができます (( バツ -> ) 出力:9 8 7 6 5 4 3 2 1 0 同様に、このコマンドを正常に実行するために多くの方法を試すことができます。 | ここで-は単項ポストデクリメント演算子です。 while(x-> 0)// xは0になります {{ printf( "%d"、x); } 最初は、条件は次のように評価されます (x> 0)// 10> 0 条件が真であるため、値が減少してループに入ります。 x-- // x = 9 そのため、最初に出力される値は9です。 等々。最後のループではx = 1なので、条件は真です。単項演算子に従って、値は印刷時にx = 0に変更されました。 ここで、x = 0であり、条件(x> 0)がfalseと評価され、whileループが終了します。 | これ->は演算子ではありません。 ->のような演算子がありますが、->のような演算子はありません。これは、while(x-> 0)の誤った解釈です。これは、xにポストデクリメント演算子があり、このループがゼロより大きくなるまで実行されることを意味します。 このコードを書くもう1つの簡単な方法は、while(x--)です。 whileループは、false条件が発生するたびに停止します。ここでは、ケースが1つだけ、つまり0です。したがって、x値がゼロにデクリメントされると停止します。 | 非常に活発な質問。この質問に答えるために10の評判を獲得してください。レピュテーション要件は、この質問をスパムや無回答のアクティビティから保護するのに役立ちます。 あなたが探している答えではありませんか? c ++ c演算子のコードフォーマット標準準拠のタグが付けられた他の質問を参照するか、独自の質問をしてください。